/******************************************************************************
 * @ File name --> SimpleSignalSolts.c
 * @ Author    --> By@ LiuYu
 * @ Version   --> V1.0
 * @ Date      --> 2017 - 06 - 15
 * @ Brief     --> 轻量级的信号与槽
 * @           --> 一个信号对应多个槽，查表调用
 *
 * @ Copyright (C) 20**
 * @ All rights reserved
 *******************************************************************************
 *
 *                                  File Update
 * @ Version   --> V1.1
 * @ Author    --> By@ LiuYu
 * @ Date      --> 2017 - 09 - 12
 * @ Revise    --> 增加了槽的自定义参数，在回调槽时使用
 * @           -->
 *
 *
 ******************************************************************************
 *
 *                                  File Update
 * @ Version   --> V1.2
 * @ Author    --> By@ LiuYu
 * @ Date      --> 2017 - 09 - 29
 * @ Revise    --> 修复了信号连接第一个槽时参数无法正确存储的BUG
 * @           -->
 *
 *
 ******************************************************************************
 *
 *                                  File Update
 * @ Version   --> V2.0
 * @ Author    --> By@ LiuYu
 * @ Date      --> 2021 - 02 - 24
 * @ Revise    --> 优化性能，使用链表，heap
 * @           -->
 *
 *
 ******************************************************************************/
#include "../inc/b_mod_signalsolts.h"
#if _SIGNAL_SOLTS_ENABLE
#include <string.h>

B_SIGNAL_T *head = NULL;

int b_signalsolts_emit(B_SIGNAL_T *signal, void *arg)
{
    if (signal == NULL)
    {
        return -1;
    }
    B_SOLTS_ITEM_T *curl;
    SL_FOREACH(signal->solts, curl)
    {
        curl->solts_handle(curl->soltsArg, arg);
    }

    return 0;
}
/******************************************************************
  * @函数说明：   连接信号与槽
  * @输入参数：   SIMPLE_SIGNAL *singnal 信号的指针（指针的指针）
                 SIMPLE_SOLTS solts     槽
  * @输出参数：   无
  * @返回参数：   int
  * @修改记录：   ----
******************************************************************/
int b_signalsolts_connect(B_SIGNAL_T *signal, B_SOLTS_ITEM_T *solts, B_SOLTS solts_handle,
                          void *soltsArg)
{
    if (signal == NULL || solts == NULL)
    {
        return -1;
    }
    // memset(solts, 0, sizeof(B_SIGNAL_T));
    solts->solts_handle = solts_handle;
    solts->soltsArg     = soltsArg;
    solts->next         = NULL;
    SL_APPEND(signal->solts, solts);  //链接

    return 0;
}
/******************************************************************
  * @函数说明：   断开信号槽
  * @输入参数：   SIMPLE_SIGNAL *singnal 信号的指针（指针的指针）
                 SIMPLE_SOLTS solts     槽
  * @输出参数：   无
  * @返回参数：   int
  * @修改记录：   ----
******************************************************************/
int b_signalsolts_disconnect(B_SIGNAL_T *signal, B_SOLTS_ITEM_T *solts)
{
    if (signal == NULL || solts == NULL)
    {
        return -1;
    }
    SL_DELETE(signal->solts, solts);

    return 0;
}
#endif